package org.japo.java.basics.main;

/*******************************************************************************
 * @author José A. Pacheco Ondoño
 * @version 1.1 - 24/10/2011
 * 
 * Sintaxis;
 *     java ClaseDouble | more
 *
 * Este programa sirve para ilustrar la utilización de los recursos de la clase 
 * Double.
 ******************************************************************************/
public class ClaseDouble {

    /***************************************************************************
     * Método de entrada al programa
     **************************************************************************/
    public static void main(String[] arg) {
        // Constantes
        final String TEXTO = "1.3579";

        // Declaración de variables para la demostración
        double numDouble = 2.4680;
        Double objDouble;

        // Constantes predefinidas
        System.out.println();
        System.out.println("Constantes predefinidas de la clase Double ...");
        System.out.println("Valor mínimo de un double MIN_VALUE --> " + 
                Double.MIN_VALUE);
        System.out.println("Valor máximo de un double MAX_VALUE --> " + 
                Double.MAX_VALUE);
        System.out.println("Valor de un no número     NaN --------> " + 
                Double.NaN);
        System.out.println("Infinito negativo NEGATIVE_INFINITY --> " + 
                Double.NEGATIVE_INFINITY);
        System.out.println("Infinito positivo POSITIVE_INFINITY --> " + 
                Double.POSITIVE_INFINITY);
        System.out.println("Número de bits de la representación --> " + 
                Double.SIZE);

        // Constructor a partir de un double
        System.out.println();
        System.out.println("A partir del número ...");
        System.out.println(numDouble);
        System.out.println("... se obtiene el objeto Double ...");
        objDouble = new Double(numDouble);
        System.out.println(objDouble);

        // Constructor a partir de una cadena
        System.out.println();
        System.out.println("A partir de la cadena ...");
        System.out.println("\"" + TEXTO + "\"");
        System.out.println("... se obtiene el objeto Double ...");
        try {
            objDouble = new Double(TEXTO);
            System.out.println(objDouble);
        } catch (NumberFormatException nfe) {
            System.out.println("La cadena no se puede convertir a Double ...");
            System.out.println(nfe);
        }

        // Conversión de una cadena a objeto Double
        System.out.println();
        System.out.println("A partir de la cadena ...");
        System.out.println("\"" + TEXTO + "\"");
        System.out.println("... se obtiene el objeto Double ...");
        try {
            System.out.println(Double.valueOf(TEXTO));
        } catch (NumberFormatException nfe) {
            System.out.println("La cadena no se puede convertir a Double ...");
            System.out.println(nfe);
        }
        System.out.println("Nota: Este método es estático, por ello ...");
        System.out.println("... NO SE INSTANCIA la clase Double.");

        // Conversión de una cadena a número real
        System.out.println();
        System.out.println("A partir de la cadena ...");
        System.out.println("\"" + TEXTO + "\"");
        System.out.println("... se obtiene el double ...");
        try {
            System.out.println(Double.parseDouble(TEXTO));
        } catch (NumberFormatException nfe) {
            System.out.println("La cadena no se puede convertir a Double ...");
            System.out.println(nfe);
        }
        System.out.println("Nota: Este método es estático, por ello ...");
        System.out.println("... NO SE INSTANCIA la clase Double.");

        // Conversión de un número double a cadena de caracteres
        System.out.println();
        System.out.println("A partir del número ...");
        System.out.println(numDouble);
        System.out.println("... se obtiene su valor decimal en la cadena ...");
        System.out.println("\"" + Double.toString(numDouble) + "\"");
        System.out.println("Nota: Este método es estático, por ello ...");
        System.out.println("... NO SE INSTANCIA la clase Double.");

        // Conversión de un objeto Double a cadena
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 2.4680;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene la cadena ...");
        System.out.println("\"" + objDouble.toString() + "\"");

        // Conversión de un objeto Double a número byte
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 246.80;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene el número de tipo byte ...");
        System.out.println(objDouble.byteValue());
        System.out.println("Nota: Puede haber desbordamiento.");

        // Conversión de un objeto Double a número short
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 246.80;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene el número de tipo short ...");
        System.out.println(objDouble.shortValue());
        System.out.println("Nota: Puede haber desbordamiento.");

        // Conversión de un objeto Double a número int
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 24680;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene el número de tipo int ...");
        System.out.println(objDouble.intValue());
        System.out.println("Nota: Puede haber desbordamiento.");

        // Conversión de un objeto Double a número long
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 24680;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene el número de tipo long ...");
        System.out.println(objDouble.longValue());

        // Conversión de un objeto Double a número float
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 24680;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene el número de tipo float ...");
        System.out.println(objDouble.floatValue());

        // Conversión de un objeto Double a número double
        System.out.println();
        System.out.println("A partir del objeto Double ...");
        numDouble = 24680;
        objDouble = new Double(numDouble);
        System.out.println(objDouble);
        System.out.println("... se obtiene el número de tipo double ...");
        System.out.println(objDouble.doubleValue());

        // Verifica si un número double es infinito en magnitud
        numDouble = 1 / 0.0;
        System.out.println();
        if (Double.isInfinite(numDouble)) {
            System.out.println("El número " + numDouble + " SI es infinito.");
        } else {
            System.out.println("El número " + numDouble + " NO es infinito.");
        }
        System.out.println("Nota: Este método es estático, por ello ...");
        System.out.println("... NO SE INSTANCIA la clase Double.");

        // Verifica si un objeto double es infinito en magnitud
        numDouble = 1 / 0.0;
        objDouble = new Double(numDouble);
        System.out.println();
        if (objDouble.isInfinite()) {
            System.out.println("El objeto " + objDouble + " SI es infinito.");
        } else {
            System.out.println("El objeto " + objDouble + " NO es infinito.");
        }

        // Verifica si un objeto double es real o imaginario
        numDouble = Math.sqrt(-4);
        objDouble = new Double(numDouble);
        System.out.println();
        if (objDouble.isNaN()) {
            System.out.println("El objeto " + objDouble + " NO es real.");
        } else {
            System.out.println("El objeto " + objDouble + " SI es real.");
        }
    }
}